package main

import (
	"errors"
	"fmt"
	"os"
)

const rows, columns = 9, 9

// Grid is a Sudoku grid
type Grid [rows][columns]int8

// Errors that could occur.
var (
	ErrBounds = errors.New("out of bounds")
	ErrDigit  = errors.New("invalid digit")
)

// Set a digit on a Sudoku grid
func (g *Grid) Set(row, column int, digit int8) error {
	// 如果越界了
	if !inBounds(row, column) {
		return ErrBounds
	}

	// 如果参数不合法
	if !validDigit(digit) {
		return ErrDigit
	}

	g[row][column] = digit
	return nil
}

// 判断是否在边界内
func inBounds(row, column int) bool {
	if row >= 0 && row < rows && column >= 0 && column < columns {
		return true
	}
	return false
}

// 判断参数是否合法
func validDigit(digit int8) bool {
	return digit >= 1 && digit <= 9
}

// 按需返回错误
func main() {
	var g Grid
	err := g.Set(0, 0, 6)
	fmt.Println(err)
	if err != nil {
		switch err {
		case ErrBounds, ErrDigit:
			fmt.Println("Les erreurs de paramètres hors limites.")
		default:
			fmt.Println(err)
		}
		os.Exit(1)
	}
}
